package com.cskaoyan.javase.oop1._1basic;

/**
 * @description: 引用数据类型的全新理解
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 我们通过数组的初始化来认识了引用数据类型:
 *      是由两部分组成,栈上创建引用,堆上创建对象,对象是本质,但是只能通过引用间接访问
 * 我们这样认识引用数据类型,它的定义就和基本数据类型割裂开了
 * 所以为了统一它们的定义,我们仍然需要从数据类型的定义入手,来重新认识引用数据类型
 *
 * 数据类型的定义: 一组数据的集合和基于这组数据的合法操作
 * 比如int,int数据类型定义了一个范围内的整数,然后定义了它能够进行的运算
 * 类的定义: 类是创建对象的模板,实际上就是成员变量 + 成员方法
 * 类比,往数据类型的定义上套:
 *      一组数据的集合就是成员变量的集合
 *      基于这种数据的合法操作就是成员方法的集合
 * 于是类就可以看成是一种自定义的数据类型,我们把这种自定义的数据类型,称之为引用数据类型
 *
 * 基本数据类型和我们自定义的数据类型(引用数据类型)的区别:
 *      1,基本数据类型属于Java当中已经定义好的数据类型,所以JVM能够正常帮助我们开辟基本数据类型的空间，正常的给变量赋值
 *      2,引用数据类型不是已经定义好的数据类型,而是程序员自己定义的数据类型
 *          这个时候JVM对这个类型是一无所知,要想让JVM帮助我们创建引用数据类型的对象,显然不可能直接创建
 *          这个时候需要先让JVM充分认识了解该类型,然后才能创建对象
 *          这个jvm认识了解类型的过程,我们称之为"类加载"
 *
 *      思考:
 *          1,类加载这个过程,和创建对象的过程,谁先谁后?
 *          类加载一定在创建对象之前,创建对象一定在类加载之后
 *
 *          2,类加载是JVM认识一个引用数据类型过程,那么它的过程是什么样的?
 *          类加载过程中,jvm会把一个类的字节码文件(class文件)读取进方法区,然后通过一系列的操作
 *          JVM就会认识该类型,于是jvm就可以创建该类型的对象了
 *
 *          3,一个类如果需要创建多个对象,那么类加载会有几次?
 *          类加载在一次程序执行的过程中,一个类只会类加载一次
 *
 *          4,类加载是懒加载,只有到了一定必须要进行类加载的时候,才会进行类加载(为了程序的执行效率)
 *           我们把一定会触发类加载的条件,称之为"类加载的时机"
 *           我们目前学习的类加载的时机:
 *              1,创建一个类的对象,一定会触发该类类加载
 *              2,启动一个类的main方法,也会触发该类类加载(类加载过程在main方法执行之前)
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        A a = new A();
        a.num = 100;
        a.printNum(); //100
    }
}

class A {
    int num;
    public void printNum() {
        //在成员方法当中,是可以自由的访问成员变量的
        System.out.println(num);
    }
}
